|
1
|
|
|
/*! |
|
2
|
|
|
* Copyright (c) 2022 Pedro José Batista, licensed under the MIT License. |
|
3
|
|
|
* See the LICENSE.md file in the project root for more information. |
|
4
|
|
|
*/ |
|
5
|
|
|
/* eslint-disable @typescript-eslint/naming-convention,@typescript-eslint/no-unsafe-argument */ |
|
6
|
1 |
|
import Decimal from "decimal.js"; |
|
7
|
1 |
|
import Format from "./format"; |
|
8
|
|
|
import type { Locale, FormatOptions, Notation, Style } from "./format"; |
|
9
|
|
|
|
|
10
|
1 |
|
const main = (Decimal: Decimal.Constructor) => { |
|
11
|
|
|
// Do not attempt to redefine the module, if already extended |
|
12
|
2 |
|
if (typeof Decimal.Format !== "undefined") { |
|
13
|
|
|
return; |
|
14
|
|
|
} |
|
15
|
|
|
|
|
16
|
1 |
|
Object.defineProperty(Decimal, "Format", { value: Format }); |
|
17
|
1 |
|
Object.defineProperty(Decimal.prototype, "toLocaleString", { |
|
18
|
|
|
value: function (this: Decimal.Instance, locales, options) { |
|
19
|
4 |
|
return new Decimal.Format(locales, options).format(this); |
|
20
|
|
|
} as typeof Decimal.prototype.toLocaleString, |
|
21
|
|
|
}); |
|
22
|
|
|
}; |
|
23
|
|
|
|
|
24
|
2 |
|
main(globalThis.__Decimal__Class__Global__ ?? require("decimal.js")); |
|
25
|
|
|
|
|
26
|
|
|
declare module "decimal.js" { |
|
27
|
|
|
export interface Decimal { |
|
28
|
|
|
/** |
|
29
|
|
|
* Returns a string with a language-sensitive representation of this decimal number. |
|
30
|
|
|
* |
|
31
|
|
|
* @template N Numeric notation of formatting. |
|
32
|
|
|
* @template S Numeric style of formatting. |
|
33
|
|
|
* @param locales A string with a [BCP 47](https://www.rfc-editor.org/info/bcp47) language tag, or an |
|
34
|
|
|
* array of such strings. |
|
35
|
|
|
* |
|
36
|
|
|
* For the general form and interpretation of this parameter, see the [Intl page on |
|
37
|
|
|
* MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl). |
|
38
|
|
|
* @param options Object used to configure the behavior of the string localization. |
|
39
|
|
|
* @returns A localized and formatted string. |
|
40
|
|
|
*/ |
|
41
|
|
|
toLocaleString: <N extends Notation = "standard", S extends Style = "decimal">( |
|
42
|
|
|
locales?: Locale | Locale[], |
|
43
|
|
|
options?: FormatOptions<N, S>, |
|
44
|
|
|
) => string; |
|
45
|
|
|
} |
|
46
|
|
|
|
|
47
|
|
|
// In order to appropriately represent the Format class, it needs to be placed on Decimal as a 'static' member: |
|
48
|
|
|
|
|
49
|
|
|
// eslint-disable-next-line @typescript-eslint/no-namespace |
|
50
|
|
|
export namespace Decimal { |
|
51
|
|
|
/** |
|
52
|
|
|
* The `Decimal.Format` object enables language-sensitive decimal number formatting. It is entirely |
|
53
|
|
|
* based on `Intl.NumberFormat`, with the options of the latter being 100% compatible with it. |
|
54
|
|
|
* |
|
55
|
|
|
* This class, however, extend the numeric digits constraints of `Intl.NumberFormat` from 21 to |
|
56
|
|
|
* 1000000000 in order to fully take advantage of the arbitrary-precision of `decimal.js`. |
|
57
|
|
|
*/ |
|
58
|
|
|
export { Format }; |
|
59
|
|
|
} |
|
60
|
|
|
} |
|
61
|
|
|
|
|
62
|
|
|
declare global { |
|
63
|
|
|
export class globalThis { |
|
64
|
|
|
/** Used by the `extend` submodule to prevent it from loading directly from `decimal.js`. */ |
|
65
|
|
|
static __Decimal__Class__Global__: Decimal.Constructor | undefined; |
|
66
|
|
|
} |
|
67
|
|
|
} |
|
68
|
1 |
|
export { Decimal }; |
|
69
|
|
|
export default Decimal; |
|
70
|
|
|
|